package cn.iocoder.yudao.module.system.api.tenant;

import cn.iocoder.yudao.module.system.api.tenant.dto.TenantDTO;
import cn.iocoder.yudao.module.system.api.tenant.dto.TenantSaveReqDTO;

import java.math.BigDecimal;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * 多租户的 API 接口
 *
 * @author 芋道源码
 */
public interface TenantApi {

    Long getTenantIdByName(String name);

    /**
     * 获得所有租户
     *
     * @return 租户编号数组
     */
    List<Long> getTenantIdList();

    /**
     * 校验租户是否合法
     *
     * @param id 租户编号
     */
    void validateTenant(Long id);


    /**
     * 校验租户是否为指定租户的代理商， parentId=id；
     * 否则报错无权访问
     * @param id 租户编号
     */
    void validateTenantIsProxy(Long id, Long parentId);

    /**
     * 获取租户拥有的外呼套餐
     * @param tenantId 租户id
     * @since 2024-03-13
     * @author PetePower
     * @return 外呼套餐id集合
     */
    List<Long> getCallChannelList(Long tenantId);

    List<Long> getCallNumberList(Long tenantId);

    /**
     * 获取租户的okcc主叫号码
     *
     * @return 主叫号码
     * @author PetePower
     * @since 2024-03-20
     */
    String getCidGroupNumber(Long tenantId);


    /**
     * 获取实际计费成本金额
     * @param tenantId 企业id
     * @since 2025-01-02
     * @author PetePower
     * @return
     */
    BigDecimal getCallCostPrice(Long tenantId);

    /**
     * 获取实际计费销售金额
     * @param tenantId
     * @since 2025-01-13
     * @author PetePower
     * @return
     */
    BigDecimal getCallSalePrice(Long tenantId);

    /**
     * 更新套餐余额
     * @param code 产品编号
     * @param keyId 用户编号，租户编号
     * @since 2024-04-22
     * @author PetePower
     */
    Long updateTenantProductBalance(String code, Long keyId, boolean isAdd, Integer value);

    /**
     * 获取套餐余额
     * @param code 产品编号
     * @param keyId 用户编号，租户编号
     * @since 2024-04-22
     * @author PetePower
     * @return 余额
     */
    Integer getTenantProductBalance(String code, Long keyId);

    Long getContactUserIdByTenant(Long tenantId);

    Map<Long, TenantDTO> getTenantMap(Collection<Long> ids);

    /**
     * 创建企业api， 目前仅给到企微授权时使用
     * @param saveReqDTO
     * @since 2024-09-20
     * @author PetePower
     * @return
     */
    Map<String, Long> createTenantApi(TenantSaveReqDTO saveReqDTO);

    /**
     * 获取租户sign
     * @param tenantId
     * @return
     */
    String getTenantSign(Long tenantId);

    Integer getTotalNumByCode(String code);

    void updateTenantCallChannel(Long tenantId, List<Long> insList, List<Long> delList);

    void createTenantCallNumber(Long tenantId, List<Long> numberIdList, Boolean isClear);
}
